package cn.ljh.zard.parse;



import java.io.InputStream;
import java.util.*;

/**
 * 解析的支持类
 * 1、维护了一个map  k-v 用文件的拓展名来获取 解析器
 */
public class ParseRegister implements IParseRegister {

    /**
     * 已知的 解析器
     * key 对应的是文件的后缀
     * value 对应的具体解析器
     */
    private HashMap<String, Parse> parseConfigs = new HashMap<String, Parse>();


    public ParseRegister() {
        registerParse("properties", new PropertieParse());
    }


    /**
     * 注册对应的解析器
     *
     * @param extensionName 文件的拓展名
     * @param parse         具体的解析器类
     */
    @Override
    public void registerParse(String extensionName, Parse parse) {
        Parse isExist = parseConfigs.get(extensionName);
        if (Objects.isNull(isExist)) {
            parseConfigs.put(extensionName, parse);
        }
    }


    /**
     * 获取当前所有的解析器
     *
     * @return
     */
    @Override
    public Collection<Parse> getParses() {
        return Collections.unmodifiableCollection(parseConfigs.values());
    }


    /**
     * 解析对应的文件 获取内容
     *
     * @return
     */
    @Override
    public InputStream parse(String key, String location) {


        Parse resolveAlias = resolveAlias(key);

        if (Objects.isNull(resolveAlias)) {
            throw new ParseException("找不到对应解析器");
        }


        return resolveAlias.parse(location);

    }


    /**
     * 获取拓展名对应的解析器
     *
     * @param string
     * @return
     */
    @SuppressWarnings("unchecked")
    @Override
    public Parse resolveAlias(String string) {
        if (string == null) {
            return null;
        }

        String key = string.toLowerCase(Locale.ENGLISH);
        if (parseConfigs.containsKey(key)) {
            return parseConfigs.get(key);
        }
        return null;

    }


}
